FusedBatchNorm
对输入张量执行融合批归一化(Fused Batch Normalization),在多核间拆分批量单元并行完成归一化与仿射变换。
\[\hat{x}_{b,c} = \frac{x_{b,c} - mean_c}{\sqrt{variance_c + \epsilon}}, \quad y_{b,c} = scale_c \cdot \hat{x}_{b,c} + offset_c\]
- 输入:
input - 输入张量首地址,形状为
[unit, channel]。scale - 缩放系数数组首地址,长度为
channel。offset - 平移系数数组首地址,长度为
channel。mean - 归一化均值数组首地址,长度为
channel。variance - 归一化方差数组首地址,长度为
channel。parameters - 参数结构体首地址,布局如下:
parameters[0]: epsilon,数值稳定项(float/float16)
parameters[1]: channel,通道数(int)
parameters[2]: unit,归一化单元数量(批量大小 × 高 × 宽)(int)core_mask(int, 可选) - 核掩码(仅适用于共享存储版本)。
- 输出:
output - 融合批归一化计算结果的张量首地址。
- 支持平台:
FT78NEMT7004备注
FT78NE 支持 fp32 数据类型。
MT7004 支持 fp16、fp32 数据类型。
共享存储版本:
-
void fp_fused_batch_norm_s(float *input, float *scale, float *offset, float *mean, float *variance, float *output, void *parameters, int core_mask)
-
void hp_fused_batch_norm_s(float16 *input, float16 *scale, float16 *offset, float16 *mean, float16 *variance, float16 *output, void *parameters, int core_mask)
C调用示例:
1// MT7004 示例(共享存储多核,DDR 地址) 2#include <stdio.h> 3 4int main(void) { 5 float *input = (float *)0x81000000; 6 float *scale = (float *)0x81020000; 7 float *offset = (float *)0x81021000; 8 float *mean = (float *)0x81022000; 9 float *variance = (float *)0x81023000; 10 float *output = (float *)0x81024000; 11 void *parameters = (void *)0x81050000; 12 13 *(float *)parameters = 1e-5f; // epsilon 14 int *int_params = (int *)((char *)parameters + 4); 15 int_params[0] = 64; // channel 16 int_params[1] = 1024; // unit 17 18 int core_mask = 0xff; 19 fp_fused_batch_norm_s(input, scale, offset, mean, variance, 20 output, parameters, core_mask); 21 return 0; 22}
私有存储版本:
-
void fp_fused_batch_norm_p(float *input, float *scale, float *offset, float *mean, float *variance, float *output, void *parameters)
-
void hp_fused_batch_norm_p(float16 *input, float16 *scale, float16 *offset, float16 *mean, float16 *variance, float16 *output, void *parameters)
C调用示例:
1// MT7004 示例(私有存储单核,AM 地址) 2#include <stdio.h> 3 4int main(void) { 5 float16 *input = (float16 *)0x10000000; 6 float16 *scale = (float16 *)0x10020000; 7 float16 *offset = (float16 *)0x10021000; 8 float16 *mean = (float16 *)0x10022000; 9 float16 *variance = (float16 *)0x10023000; 10 float16 *output = (float16 *)0x10024000; 11 void *parameters = (void *)0x10050000; 12 13 *(float16 *)parameters = float32_to_float16(1e-4f); // epsilon 14 int *int_params = (int *)((char *)parameters + 4); 15 int_params[0] = 32; // channel 16 int_params[1] = 512; // unit 17 18 hp_fused_batch_norm_p(input, scale, offset, mean, variance, 19 output, parameters); 20 return 0; 21}